<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    // Generator函数是ES6提供的一种异步编程解决方案 语法行为与传统函数完全不同 
    // Generator函数有多种理解角度 语法上 首先可以把它理解成 Generator函数是一个状态机 封装了多个内部状态
    // 执行Generator函数 会返回一个遍历器对象 也就是说 Generator函数除了状态机 还是一个遍历器对象生成函数 
    // 返回的遍历器对象可以依次遍历Generator函数内部的每一个状态
    // 形式上 Generator函数是一个普通函数 但是有两个特征 
    // 1. function关键字与函数名之间有一个星号 
    // 2. 函数体内部使用yield表达式 定义不同的内部状态(yield 产出)

    function* helloWorldGenerator() {
        yield 'hello';
        yield 'world';
        return 'ending';
    }

    var hw = helloWorldGenerator();

    // 上面定义了一个Generator函数 helloWorldGenerator 它内部有两个yield表达式(hello 和 world)
    // 该函数有三个状态
    // hello
    // world
    // return 语句

    // Generator函数的调用方法与普通函数一样 也是在函数名后面加上一对圆括号
    // 不同的是 调用Generator函数后该函数并不执行 返回的也不是函数运行结果
    // 而是指向内部状态的指针对象 也就是Iterator

    // 下一步 必须调用遍历器对象的next方法使得指针移向下一个状态 

    // 也就是说
    // 每次调用next方法 内部指针就从函数头部或上一次停下来的地方开始执行
    // 直到遇到下一个yield表达式或者return语句为止
    // Generator函数是分段执行的
    // yield表达式是暂停执行的标记 next方法可以恢复执行



    
</script>